Плохо! Плохо!:  0
Показано с 1 по 3 из 3

Тема: [MZ]DKR_UsefulPictures

  1. #1
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию [MZ]DKR_UsefulPictures

    Название плагина: DKR_UsefulPictures

    Автор: DarchanKaen

    Версия: 2.0

    Дата выхода:
    Версия 2.0 - 22.01.2022

    Описание плагина:
    Плагин позволяет использовать картинки дополнительнымы способами, а именно - вызывает Общие события при:
    1. Ховере (наведении) над картинкой.
    2. ЛКМ на картинке.
    3. При перемещении картинки после ЛКМ (реализован примитивный "Драг-н-дроп") на специальную картинку-"дропзону".
    4. ПКМ (не привязано к картинке).
    5. Клик колеса мыши ("МКМ"; не привязано к картинке").
    Может быть полезен для мини-игр, пазлов, боёвок, поинт-н-клик игр.

    Для полноценного использования нужно самое базовое знание JavaScript (создание и исп-е массивов и объектов)!

    Плагин работает ТОЛЬКО с компьютерной мышью! С геймпадом и тачскрином смартфона плагин не работает.

    Видео работы плагина (из демки):
    Спойлер Тык:




    Нюансы:
    0. Плагин не совместим с другими плагинами на мышь, даже моими.
    1. Удаление картинки не равно удалению ее настроек или дропзоны - они удаляются вызовом скрипта!
    2. Картинка может быть ИЛИ "Полезной картинкой" ИЛИ "Дропзоной" - не одновременно!
    3. Для корректно работы плагина после загрузки файла сохранения - используйте плагин Galv`а на вызов Общего события после загрузки.
    4. В ПКМ стразу встроено отмена выбранной картинки для перемещения.
    5. Плагин работает ТОЛЬКО вне боя.
    6. Плагин предоставляет базовую функциональность драг-н-дропа картинок и одним только его включением "Покер" сделать не получится.


    Использование плагина:
    Параметры плагина
    Переменные для хранения списков Картинок, Дропзон, Пересечений; переключатели для хранения статуса работы мыши и доступности перемещений картинок;
    номера общих события для ПКМ и МКМ (нажатие на колёсико мыши); номера переменных для хранения статистики

    Команды (в эвенте, в команде "Скрипт")
    DKR.UsefulPictures.disableLRMC();- отключает стандартное поведения мыши, НУЖНО ЗАПУСКАТЬ ДЛЯ РАБОТЫ ПЛАГИНА!.
    DKR.UsefulPictures.enableLRMC();- включает стандартное поведение мыши.
    DKR.UsefulPictures.setCommonEventToRMC(ceId); - задает Общее событие для ПКМ.
    DKR.UsefulPictures.setCommonEventToMMC(ceId); - задает Общее события для МКМ.
    DKR.UsefulPictures.testUsefulPics(); - выводит на консоль перечень настроенных картинок.
    DKR.UsefulPictures.createUsefulPic(picSettings); - создает настроенную картинку с заданными настройками.
    DKR.UsefulPictures.getUsefulPic(usefulPicId); - возвращает настройки картинки с указанным номером.
    DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate); - обновляет указанные настройки картинки с указанным номером.
    DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - удаляет настройку картинку с указанным номером.
    DKR.UsefulPictures.testDropzone(); - выводит на консоль перечень дропзон.
    DKR.UsefulPictures.createDropZone(dropzoneSettings ); - создает настроенную картинку с заданными настройками.
    DKR.UsefulPictures.getDropZone(dropzoneId); - возвращает дропзону с указанным номером.
    DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate); - обновляет указанные настройки дропзоны с указанным номером.
    DKR.UsefulPictures.deleteDropZone(dropzoneId); - удаляет дропзону с указанным номером.
    DKR.UsefulPictures.testVault(); - выводит на консоль список пересечений картинок и дропзон.
    DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi cId, logicOrIndex); - для получения информации, находится ли указанная картинка хоть на какой-нибудь дропзоне; возвращает true/false или номер дропзоны (-1, при негативном результате).
    DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u sefulPicId, dropzoneId); - для получения информации, находится ли указанная картинка на конкретной дропзоне; возвращает true/false.
    DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz oneId); - возвращает массив с перечнем настроек картинок, что находятся на указанной дропзоне; может вернуть пустой массив.
    где
    ceId - номер Общего события; если 0 или -1, то событие не вызывется.
    picSettings - структура настроек картинки.
    usefulPicId - номер картинки.
    listOfSettingsToUpdate - массив настроек для обновления картинки / дропзоны (['имя настройки', новое значение]).
    dropzoneSettings - структура настроект дрозпоны.
    dropzoneId - номер картинки-дропзоны.
    logicOrIndex - тип запрашиваемого значения; может быть 'logic' или 'index'.

    Спойлер Примеры настроек Картинок и Дропзон (важно!):

    Для понимания - обязательно откройте демо редактором и просмотрите!
    Настройки картинок
    Код:
    		let picSettings = {
    			id: 1,
    			mark: '',
    			isHoverable: true,
    			onHoverCommonEventId: 32,
    			isClickableLeft: true,
    			onLeftClickCommonEventId: 33,
    			isMovable: true,
    			moveSpeed: 60,
    			onDropzoneCommonEventId: 37
    		}
    Настройки дропзон
    Код:
    let dropzoneSettings = {
    			id: 1,
    			mark: '',
    			dropState: 'active'
    			dropType: 'free'
    			dropAfter: 'work'
    			onDropCommonEventId: 35
    		}


    Код:
    Спойлер Версия 2.0:

    Код:
    var Imported = Imported || {};
    Imported.DKR_UsefulPictures = true;
    
    var DKR = DKR || {};          
    DKR.UsefulPictures = DKR.UsefulPictures || {}; 
    DKR.UsefulPictures.version = 2.0;
    
    //-----------------------------------------------------------------------------
    /*:
     * @plugindesc (v.2.0.0) Плагин позволяет использовать картинки дополнительнымы способами, а именно: вызывать Общее событие по ховеру, ЛКМ, примитивному "дран-н-дропу".
     * 
     * @target MZ
     * @author DarchanKaen
     *
     * @help
     *   DKR UsefulPictures
     * ----------------------------------------------------------------------------
     * ---Общая информация:
     * Плагин позволяет использовать картинки дополнительнымы способами, 
     *  а именно - вызывает Общие события при:
     *  1. Ховере над картинкой.
     *  2. ЛКМ на картинке.
     *  3. При перемещении картинки после ЛКМ (реализован примитивный "Драг-н-дроп") на специальную картинку-"дропзону".
     *  4. ПКМ (не привязано к картинке).
     *  5. Клик колеса мыши ("МКМ"; не привязано к картинке").
     *  Плагин НЕ СОВМЕСТИМ с другими плагинами на мышь!
     *  Подробнее - смотри на rpgmaker.su в теме плагинов.
     * ---Команды(в эвенте команда "Скрипт"):
     * DKR.UsefulPictures.disableLRMC(); - отключает стандартное поведения мыши, НУЖНО ЗАПУСКАТЬ ДЛЯ РАБОТЫ ПЛАГИНА!.
     * DKR.UsefulPictures.enableLRMC(); - включает стандартное поведение мыши.
     * DKR.UsefulPictures.setCommonEventToRMC(ceId); - задает Общее событие для ПКМ.
     * DKR.UsefulPictures.setCommonEventToMMC(ceId); - задает Общее события для МКМ.
     * DKR.UsefulPictures.testUsefulPics(); - выводит на консоль перечень настроенных картинок.
     * DKR.UsefulPictures.createUsefulPic(picSettings); - создает настроенную картинку с заданными настройками.
     * DKR.UsefulPictures.getUsefulPic(usefulPicId); - возвращает настройки картинки с указанным номером.
     * DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate); - обновляет указанные настройки картинки с указанным номером.
     * DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - удаляет настройку картинку с указанным номером.
     * DKR.UsefulPictures.testDropzone(); - выводит на консоль перечень дропзон.
     * DKR.UsefulPictures.createDropZone(dropzoneSettings  ); - создает настроенную картинку с заданными настройками.
     * DKR.UsefulPictures.getDropZone(dropzoneId); - возвращает дропзону с указанным номером.
     * DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate); - обновляет указанные настройки дропзоны с указанным номером.
     * DKR.UsefulPictures.deleteDropZone(dropzoneId); - удаляет дропзону с указанным номером.
     * DKR.UsefulPictures.testVault(); - выводит на консоль список пересечений картинок и дропзон.
     * DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi  cId, logicOrIndex); - для получения информации, находится ли указанная картинка хоть на какой-нибудь дропзоне; возвращает true/false или номер дропзоны (-1, при негативном результате).
     * DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u  sefulPicId, dropzoneId); - для получения информации, находится ли указанная картинка на конкретной дропзоне; возвращает true/false.
     * DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz  oneId) - возвращает массив с перечнем настроек картинок, что находятся на указанной дропзоне; может вернуть пустой массив.
    где
     * ceId - номер Общего события; если 0 или -1, то событие не вызывется.
     * picSettings - структура настроек картинки.
     * usefulPicId - номер картинки.
     * listOfSettingsToUpdate - массив настроек для обновления картинки / дропзоны (['имя настройки', новое значение]).
     * dropzoneSettings - структура настроект дрозпоны.
     * dropzoneId - номер картинки-дропзоны.
     * logicOrIndex - тип запрашиваемого значения; может быть 'logic' или 'index'.
     * 
     * ДЛЯ ПОНИМАНИЯ СТРУКТУРЫ НАСТРОЕК КАРТИНКИ И ДРОПЗОНЫ - ОТКРОЙКТЕ ПЛАГИН БЛОКНОТОМ И НАЙДИТЕ "SETTINGS STRUCTURES".
     * ПОДРОБНЕЕ - СМОТРИ ДЕМКУ на rpgmaker.su В ТЕМЕ ПЛАГИНА!
     * ----------------------------------------------------------------------------
     *
     * @param defaultLRMCWorkSwitchId
     * @type number
     * @desc Номер переключателя, хранящего статус стандартной / нестандартной работы мыши. Не для ручного переключения. (НЕОБХОДИМ!)
     * @default 12
     *
     * @param usefulPicturesListVarId
     * @type variable
     * @desc Номер переменной для сохранения Списка картинок (НЕБХОДИМ!)
     * @default 71
     *
     * @param dropzonesListVarId
     * @type variable
     * @desc Номер переменной для сохранения Списка дропзон (НЕБХОДИМ!)
     * @default 72
      *
     * @param vaultListVarId
     * @type variable
     * @desc Номер переменной для сохранения Списка пересечений картинок и дропзон 
     * @default 73
     *
     * @param movableSwitchId
     * @type number
     * @desc Номер переключателя, позволяющего движение картинок
     * @default 13
     *
     * @param rightMouseClickEventId
     * @type number
     * @desc Номер Общего события на ПКМ
     * @default 34
     *
     * @param middleMouseClickEventId
     * @type number
     * @desc Номер Общего события на МКМ (колёсико)
     * @default 36
     *
     * @param lastHoveredPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, по которой последний раз был Ховер
     * @default 65
     *
     * @param lastClickedPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, по которой последний раз был клик ЛКМ
     * @default 66
     *
     * @param lastMovedPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, по которая последний раз перемещалась
     * @default 67
     *
     * @param lastDroppedPicVarId
     * @type variable
     * @desc Номер переменной для хранения номера картинки, которая последний раз помещалась в дропзону
     * @default 68
     *
     * @param lastUsedDropzoneVarId
     * @type variable
     * @desc Номер переменной для хранения номера дропзоны, на которую в послдний раз перемещалась картинка
     * @default 69
     *
     *
     */
    
    
    
    //UNCOMPABILE WTH PRIMITIVE BUTTON! BUT WORK WITH DEFAULT TEXT BUTTON!
    ( () => {
    	
    	
    	
    //----DATA: BEGIN	
    	//---params
    	DKR.UsefulPictures.parameters = PluginManager.parameters('DKR_UsefulPictures');
    	
    	let defaultLRMCWorkSwitchId = Number(DKR.UsefulPictures.parameters["defaultLRMCWorkSwitchId"]);
    	let usefulPicturesListVarId = Number(DKR.UsefulPictures.parameters["usefulPicturesListVarId"]);
    	let dropzonesListVarId = Number(DKR.UsefulPictures.parameters["dropzonesListVarId"]);
    	let vaultListVarId = Number(DKR.UsefulPictures.parameters["vaultListVarId"]);
    
    	let rightMouseClickEventId = Number(DKR.UsefulPictures.parameters["rightMouseClickEventId"]);
    	let middleMouseClickEventId = Number(DKR.UsefulPictures.parameters["middleMouseClickEventId"]);
    	
    	let movableSwitchId = Number(DKR.UsefulPictures.parameters["movableSwitchId"]);
    	
    	let lastHoveredPicVarId = Number(DKR.UsefulPictures.parameters["lastHoveredPicVarId"]);
    	let lastClickedPicVarId = Number(DKR.UsefulPictures.parameters["lastClickedPicVarId "]);
    	let lastMovedPicVarId = Number(DKR.UsefulPictures.parameters["lastMovedPicVarId"]);
    	let lastDroppedPicVarId = Number(DKR.UsefulPictures.parameters["lastDroppedPicVarId"]);
    	let lastUsedDropzoneVarId = Number(DKR.UsefulPictures.parameters["lastUsedDropzoneVarId"]);
    	
    	//--inner data
    	let pictureToMoveId = -1;
    	let pictureToMoveSpeed = -1;
    	let touchedDropzoneId = -1;
    	
    	const picToMoveOrigin = 0;
    	const picToMoveScaleX = 100;
    	const picToMoveScaleY = 100;
    	const picToMoveOpacity = 255;
    	const picToMoveBlendMode = 0;
    	
    	const DROPZONE_TYPE_LOCK_CODEWORD = 'lock';
    	const DROPZONE_STATE_SLEEP_CODEWORD = 'sleep';
    	const DROPZONE_AFTER_OFF_CODEWORD = 'off';
    	
    	const GET_PIC_ON_DROPZONE_LOGIC_CODEWORD = 'logic';
    	const GET_PIC_ON_DROPZONE_INDEX_CODEWORD = 'index';
    	
    	/*
    	    //---- SETTINGS STRUCTURES
    		
    		//--USEFUL PICS
    			//-CREATE USEFUL PIC:
    		let picSettings = {
    			id: 1,
    			mark: '',
    			isHoverable: true,
    			onHoverCommonEventId: 32,
    			isClickableLeft: true,
    			onLeftClickCommonEventId: 33,
    			isMovable: true,
    			moveSpeed: 60,
    			onDropzoneCommonEventId: 37
    		}
    		createUsefulPicture(picSettings);
    			//-UPDATE USEFUL PIC:
    		updateUsefulPicture(1, [[mark: 'aasd'], [isHoverable: false]])
    			//-DELETE  USEFUL PIC
    		deleteUsefulPicture(1);
    		
    		//--DROPZONES
    			//-CREATE DROPZONE
    		let dropzoneSettings = {
    			id: 1,
    			mark: '',
    			dropState: 'active', 'sleep'
    			dropType: 'free', 'lock' //LOCK
    			dropAfter: 'work', 'off'
    			onDropCommonEventId: 35
    		}
    		createDropzone(dropzoneSettings);
    			//-UPDATE DROPZONE:
    		updateDropzone(1, [[mark: 'aasd'], [dropMode: part]])
    			//-DELETE  DROPZONE
    		deleteDropzone(1);
    		
    		//--DEMO INGAME TEST
    		45 = red dropzone
    		34   = yellow drpzone
    		21  = black pic
    		11 = blue picture
    		1  = green pic
    	*/
    	
    //----DATA: END	
    		
    	
    //----PLUGIN LOGIC: BEGIN	
    
    	//---USEFUL PICTURES (HOVER AND CLICK)
    	//--create
    	const createUsefulPicture = (usefulPicSettings) => {
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		if(-1 === usefulPicsList.indexOf(usefulPicSettings)){
    			usefulPicsList.push(usefulPicSettings);
    			$gameVariables.setValue(usefulPicturesListVarId, usefulPicsList);
    		}
    	}
    	
    	//--update
    	const updateUsefulPicture = (usefulPicId, listOfSettingsToUpdate) => {
    		let usefulPic = getUsefulPicture(usefulPicId);
    		
    		if(null === usefulPic || undefined === usefulPic){
    			console.log('DKR.UsefulPictures_ERROR: USEFUL PIC ARE NOT EXIST! Id:', usefulPicId);
    			return;
    		}else{
    			for(let n = 0; n < listOfSettingsToUpdate.length; n++){
    				let currSettingName = listOfSettingsToUpdate[n][0];
    				let currSettingValue = listOfSettingsToUpdate[n][1];
    				if( false === usefulPic.hasOwnProperty  ){
    					console.log('DKR.UsefulPictures_ERROR: SETTINGS ARE NOT EXIST!');
    				}else{
    					usefulPic[currSettingName] = currSettingValue;
    				}
    			}
    			let index = getUsefulPictureIndexIn(usefulPicId);
    			let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    			usefulPicsList[index] = usefulPic;
    			$gameVariables.setValue(usefulPicturesListVarId, usefulPicsList);
    		}
    		
    	}
    	
    	//--get
    	const getUsefulPicture = (usefulPicId) => {
    		let usefulPic = null;
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		
    		usefulPic = usefulPicsList.filter(pic => pic.id === usefulPicId)[0];
    		
    		return usefulPic;
    	}
    	
    	//--delete
    	const deleteUsefulPicture = (usefulPicId) => {
    		let index = getUsefulPictureIndexIn(usefulPicId);
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		
    		delete usefulPicsList[index];
    		usefulPicsList = usefulPicsList.filter(pic => pic === pic);
    		$gameVariables.setValue(usefulPicturesListVarId, usefulPicsList);
    		
    		deleteUsefulPicOrDropzoneFromVault(usefulPicId, true);
    	}
    	
    	//--get index in
    	const getUsefulPictureIndexIn = (usefulPicId) => {
    		let innerIndex = -1;
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsList.length; n++){
    			if(usefulPicId === usefulPicsList[n].id){
    				innerIndex = n;
    			}
    		}
    		
    		return innerIndex;
    	}
    	//---
    	
    	
    	//---DROPZONES (USEFUL PICTURES DETECTORS)
    	//-create
    	const createDropzone = (dropzoneSettings) => {
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		if(-1 === dropzonesList.indexOf(dropzoneSettings)){
    			dropzonesList.push(dropzoneSettings);
    			$gameVariables.setValue(dropzonesListVarId, dropzonesList);
    		}
    	}
    	
    	//--update
    	const updateDropzone = (dropzoneId, listOfSettingsToUpdate) => {
    		let dropzone = getDropzone(dropzoneId);
    		
    		if(null === dropzone || undefined === dropzone){
    			console.log('DKR.UsefulPictures_ERROR: DROPZONE ARE NOT EXIST!');
    			return;
    		}else{
    			for(let n = 0; n < listOfSettingsToUpdate.length; n++){
    				let currSettingName = listOfSettingsToUpdate[n][0];
    				let currSettingValue = listOfSettingsToUpdate[n][1];
    				if( false === dropzone.hasOwnProperty  ){
    					console.log('DKR.UsefulPictures_ERROR: SETTINGS ARE NOT EXIST!');
    				}else{
    					dropzone[currSettingName] = currSettingValue;
    				}
    			}
    			
    			let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    			let index = getDropzoneIndexIn(dropzoneId);
    			dropzonesList[index] = dropzone;
    			$gameVariables.setValue(dropzonesListVarId, dropzonesList);
    		}
    		
    	}
    	
    	//--get
    	const getDropzone = (dropzoneId) => {
    		let dropzone = null;
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    	
    		dropzone = dropzonesList.filter(dropzone => dropzone.id === dropzoneId)[0];
    		
    		return dropzone;
    	}
    	
    	//--delete
    	const deleteDropzone = (dropzoneId) => {
    		let index = getDropzoneIndexIn(dropzoneId);
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		
    		delete dropzonesList[index];
    		dropzonesList = dropzonesList.filter(dropzone => dropzone === dropzone);
    		$gameVariables.setValue(dropzonesListVarId, dropzonesList);
    		
    		deleteUsefulPicOrDropzoneFromVault(dropzoneId, false);
    	}
    	
    	//--is contain usefulPic in dropzone
    	const isUsefulPicInDropzones = (gamePictureCoordsList) => {
    		let matchedDropzone = null;
    		let xCoord = gamePictureCoordsList[0];
    		let yCoord = gamePictureCoordsList[1];
    		
    		let gamePicturesList = $gameScreen._pictures;
    		for(let n = 1; n < gamePicturesList.length; n++){ //pictures start with 1!!!
    			
    			if(-1 !== getDropzone(n) ){
    				
    				let currentDropzone = getDropzone(n);
    				if(null !== currentDropzone && undefined !== currentDropzone){
    					let dropzonePicWidthAndHeight = getPictureWidthAndHeight(n);
    					
    					let dropzoneBeginX = gamePicturesList[n]._x;
    					let dropzoneBeginY = gamePicturesList[n]._y;
    					let dropzoneEndX = dropzoneBeginX + dropzonePicWidthAndHeight[0];
    					let dropzoneEndY = dropzoneBeginY + dropzonePicWidthAndHeight[1];
    					
    					let isInDropzone = isDestinationCoordInDropzone(xCoord, yCoord, dropzoneBeginX, dropzoneBeginY, dropzoneEndX, dropzoneEndY);
    					
    					if(true === isInDropzone){
    						matchedDropzone = currentDropzone;
    					}
    				}
    				
    			}
    			
    		}
    		
    		return matchedDropzone;
    	}
    	
    	const isDestinationCoordInDropzone = (clickX, clickY, dropzoneBeginX, dropzoneBeginY, dropzoneEndX, dropzoneEndY) => {
    		let isInDropZone = false;
    		
    		if(
    			( clickX >= dropzoneBeginX && clickX <= dropzoneEndX ) &&
    			( clickY >= dropzoneBeginY && clickY <= dropzoneEndY )
    		){
    			isInDropZone = true;
    		}
    		
    		return isInDropZone;
    	}
    	
    	//--get index in
    	const getDropzoneIndexIn = (dropzoneId) => {
    		let innerIndex = -1;
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		
    		for(let n = 0; n < dropzonesList.length; n++){
    			if(dropzoneId === dropzonesList[n].id){
    				innerIndex = n;
    			}
    		}
    		
    		return innerIndex;
    	}
    	//---
    	
    	
    	//---VAULT OF USEFUL PICS ON DROPZONES (STORAGE FOR USEFUL PICTURES ON DROPZONES)
    		//if one in Vault - FOREVER in vault!
    		
    	//--add
    	const addUsefulPicOnDropzoneToVault = (usefulPicId, dropzoneId) => {
    		let vaultObj = null;
    		let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId);
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		if(-1 === vaultObjIndex){
    			vaultObj = {usefulPicId, dropzoneId, isOn: true};
    			usefulPicsOnDropzonesVault.push(vaultObj);
    			$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    		}else{
    			vaultObj = getVaultObj(usefulPicId, dropzoneId);
    			vaultObj.isOn = true;
    			usefulPicsOnDropzonesVault[vaultObjIndex] = vaultObj;
    			$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    		}
    	}
    	
    	//--remove (off)
    	const removeUsefulPicOnDropzoneFromVault = (usefulPicId) => {
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		let vaultObj = null;
    		for(let n = 0; n < dropzonesList.length; n++){
    			let dropzoneId = dropzonesList[n].id;
    			let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId);
    			if(-1 === vaultObjIndex){
    				continue;
    			}else{
    				vaultObj = getVaultObj(usefulPicId, dropzoneId);
    				vaultObj.isOn = false;
    				usefulPicsOnDropzonesVault[vaultObjIndex] = vaultObj;
    				$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    			}
    		}	
    	}
    	
    	//--delete (full delete from vault)
    	const deleteUsefulPicOrDropzoneFromVault = (someId, isDeleteUsefulPic) => {
    		let toDelIndexesList = [];
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		let vaultObj = null;
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			vaultObj = usefulPicsOnDropzonesVault[n];
    			if(true === isDeleteUsefulPic){
    				if(someId === vaultObj.usefulPicId){
    					toDelIndexesList.push(n);
    				}
    			}else{
    				if(someId === vaultObj.dropzoneId){
    					toDelIndexesList.push(n);
    				}
    			}
    		}
    		
    		for(let m = 0; m < toDelIndexesList.length; m++){
    			let currToDelIndex = toDelIndexesList[m];
    			delete usefulPicsOnDropzonesVault[currToDelIndex];
    		}
    		
    		usefulPicsOnDropzonesVault = usefulPicsOnDropzonesVault.filter(someVaultObj => someVaultObj === someVaultObj);
    		$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    	}
    	
    	//--get
    	const getVaultObj = (usefulPicId, dropzoneId) => {
    		let vaultObj = null;
    		let vaultObjIndex = isAlreadyInVault(usefulPicId, dropzoneId);
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		if( -1 !== vaultObjIndex ){
    			vaultObj = usefulPicsOnDropzonesVault[vaultObjIndex];
    		}
    		
    		return vaultObj;
    	}
    	
    	//--search
    	const isAlreadyInVault = (usefulPicId, dropzoneId) => {
    		let isInVault = -1;
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(usefulPicId === currentVaultObj.usefulPicId && dropzoneId === currentVaultObj.dropzoneId){ // && true === currentVaultObj.isOn
    				isInVault = n;
    			}
    		}
    		
    		return isInVault;
    	}
    	
    	//--for outer code (... .isUsefulPicOnDropzones)
    	const isUsefulPictureOnDropzones = (usefulPicId, resultType) => {
    		let result = false;
    		let dropzoneIndex = -1;
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(usefulPicId === currentVaultObj.usefulPicId && true === currentVaultObj.isOn){
    				dropzoneIndex = currentVaultObj.dropzoneId
    				break;
    			}
    		}
    		
    		if(GET_PIC_ON_DROPZONE_LOGIC_CODEWORD === resultType){
    			if(-1 === dropzoneIndex){
    				result = false;
    			}else{
    				result = true;
    			}
    		}else if(GET_PIC_ON_DROPZONE_INDEX_CODEWORD === resultType){
    			result = dropzoneIndex;
    		}else{
    			console.log('DKR.UsefulPictures_ERROR: RESULT VARIANT ARE NOT EXIST!:', resultType);
    		}
    
    		return result;
    	}
    	
    	//--for outer code (... .isUsefulPicOnConcreteDropzone)
    	const isUsefulPictureOnConcreteDropzone = (usefulPicId, dropzoneId) => {
    		let result = false;
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(usefulPicId === currentVaultObj.usefulPicId && dropzoneId === currentVaultObj.dropzoneId && true === currentVaultObj.isOn){ // 
    				result = true;
    				break;
    			}
    		}
    		
    		return result;
    	}
    	
    	//--for outer code (... .getUsefulPicsOnDropzone)
    	const getUsefulPicturesFromDropzone = (dropzoneId) => {
    		let usefulPicsOnDropzoneList = [];
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		
    		let vaultObjectsOnDropzone = [];
    		for(let n = 0; n < usefulPicsOnDropzonesVault.length; n++){
    			let currentVaultObj = usefulPicsOnDropzonesVault[n];
    			if(dropzoneId === currentVaultObj.dropzoneId && true === currentVaultObj.isOn){
    				vaultObjectsOnDropzone.push(currentVaultObj);
    			}
    		}
    		
    		for(let m = 0; m < vaultObjectsOnDropzone.length; m++){
    			let currentVaultObj = vaultObjectsOnDropzone[m];
    			let currentUsefulPicture = getUsefulPicture(currentVaultObj.usefulPicId);
    			usefulPicsOnDropzoneList.push(currentUsefulPicture  );
    		}
    		$gameVariables.setValue(vaultListVarId, usefulPicsOnDropzonesVault);
    
    		return usefulPicsOnDropzoneList;
    	}
    	//---
    	
    	
    	//---UTILS
    	const setPictureIdToVariable = (picId, varId) =>{
    		if(varId > 0){
    			$gameVariables.setValue(varId, picId);
    		}
    	}
    	
    //----PLUGIN LOGIC: END
    	
    	
    	
    //----MAKER !!! MOUSE !!! LOGIC: BEGIN	
    	//---DISABLE MOUSE STANDARD BEHAVIOUR
    	const disableMouseStandardBehaviour = () =>{
    		Game_Temp.prototype.setDestination = function(x, y) {};
    		Scene_Map.prototype.isMenuCalled = function() {
    			return Input.isTriggered('menu');
    		};
    		//isDefaultLRMCWork = false;
    		let isDefaultLRMCWork = false;
    		$gameSwitches.setValue(defaultLRMCWorkSwitchId, isDefaultLRMCWork);
    	}
    	
    	//---ENABLE MOUSE STANDARD BEHAVIOUR
    	const enableMouseStandardBehaviour = () =>{
    		Game_Temp.prototype.setDestination = function(x, y) {
    			this._destinationX = x;
    			this._destinationY = y;
    		};
    		Scene_Map.prototype.isMenuCalled = function() {
    			return Input.isTriggered("menu") || TouchInput.isCancelled();
    		};
    		//isDefaultLRMCWork = true;
    		let isDefaultLRMCWork = true;
    		$gameSwitches.setValue(defaultLRMCWorkSwitchId, isDefaultLRMCWork);
    		//--for cancel picture movement
    		pictureToMoveId = -1;
    		pictureToMoveSpeed = -1;
    		touchedDropzoneId = -1;
    	}
    	
    
    	//---ON HOVER
    	Sprite_Clickable.prototype.onMouseEnter = function() {
    		try{
    			let pic = this.picture();
    			let picId = $gameScreen._pictures.indexOf(pic);
    				
    			let usefulPictureSettings = getUsefulPicture(picId);
    			if(null == usefulPictureSettings){ 
    				console.log('DKR.UsefulPictures_ERROR: HOVER__USEFUL PICTURE NOT EXIST OR NOT SET!');
    			}else{
    				if(true === usefulPictureSettings.isHoverable && usefulPictureSettings.onHoverCommonEventId > 0){
    					setPictureIdToVariable(picId, lastHoveredPicVarId);
    					$gameTemp.reserveCommonEvent(usefulPictureSettings  .onHoverCommonEventId);
    				}
    			}	
    		}catch(exception){
    			//console.log('DKR.UsefulPictures_ERROR: onMouse-Enter: ERROR');
    			//console.log(exception);
    		}
    		
    	}
    	
    	//---ON PICTURE CLICK FOR LMC...TO CHOOSE OR CE
    	Sprite_Clickable.prototype.onClick = function() {
    		let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId);
    		if(true === isDefaultLRMCWork){
    			console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!');
    			return;
    		}
    		try{
    			let pic = this.picture();
    			let picId = $gameScreen._pictures.indexOf(pic);
    
    			let usefulPictureSettings = getUsefulPicture(picId);
    			if(null == usefulPictureSettings || undefined == usefulPictureSettings){
    				console.log('DKR.UsefulPictures_ERROR: LMC__USEFUL PICTURE NOT EXIST OR NOT SET! Id:', picId);
    			}else{
    				if(true === usefulPictureSettings.isClickableLeft && usefulPictureSettings.onLeftClickCommonEventId > 0){
    					setPictureIdToVariable(picId, lastClickedPicVarId);
    					$gameTemp.reserveCommonEvent(usefulPictureSettings  .onLeftClickCommonEventId);
    				}
    				if(true === usefulPictureSettings.isMovable){
    					pictureToMoveId = picId;
    					pictureToMoveSpeed = usefulPictureSettings.moveSpeed;
    				}
    			}
    			
    		}catch(exception){
    			console.log('DKR.UsefulPictures_ERROR: onMouse-Click: ERROR_USEFUL_PIC');
    			console.log(exception);
    		}
    	}
    	
    	//---ON NOT(!) PICTURE CLICK FOR LMC...FOR MOVE PICTURE
    	const leftMouseClickProcess = (clickEv) => {
    		let coordX = clickEv.clientX;
    		let coordY = clickEv.clientY;
    		
    		if(false === $gameSwitches.value(movableSwitchId)){
    			console.log('DKR.UsefulPictures_INFO: MOVEMENT DISABLE BY SWITCH!');
    			return;
    		}
    		
    		//--move Main part
    		if(-1 !== pictureToMoveId){
    
    			$gameScreen.movePicture(
    				pictureToMoveId, picToMoveOrigin, clickEv.clientX, clickEv.clientY, 
    				picToMoveScaleX, picToMoveScaleY, picToMoveOpacity, picToMoveBlendMode, pictureToMoveSpeed
    			);
    			setPictureIdToVariable(pictureToMoveId, lastMovedPicVarId);
    			
    			//--move Dropzone part
    			let dropzone = isUsefulPicInDropzones([clickEv.clientX, clickEv.clientY]);
    			let usefulPicture = getUsefulPicture(pictureToMoveId);
    			
    			removeUsefulPicOnDropzoneFromVault(pictureToMoveId  );	
    			
    			if(null !== dropzone && undefined !== dropzone && dropzone.mark === usefulPicture.mark && DROPZONE_STATE_SLEEP_CODEWORD !== dropzone.dropState){
    
    				setPictureIdToVariable(pictureToMoveId, lastDroppedPicVarId);
    				setPictureIdToVariable(dropzone.id, lastUsedDropzoneVarId);
    				addUsefulPicOnDropzoneToVault(usefulPicture.id, dropzone.id);
    				
    				if(DROPZONE_TYPE_LOCK_CODEWORD === dropzone.dropType){
    					updateUsefulPicture(pictureToMoveId, [ ['isMovable', false], ['isClickableLeft', false], ['onLeftClickCommonEventId', 0] ]);
    				}
    				if(usefulPicture.onDropzoneCommonEventId > 0){
    					$gameTemp.reserveCommonEvent(usefulPicture.onDropz  oneCommonEventId);
    				}
    				if(dropzone.onDropCommonEventId > 0){
    					$gameTemp.reserveCommonEvent(dropzone.onDropCommon  EventId);
    				}
    				if(DROPZONE_AFTER_OFF_CODEWORD === dropzone.dropAfter){
    					updateDropzone(dropzone.id, [['dropState', 'sleep']]);
    				}
    				
    			}
    			
    		    //--for clear picture movement
    			pictureToMoveId = -1;
    			pictureToMoveSpeed = -1;
    			touchedDropzoneId = -1;
    		}
    		
    	}
    	
    	//---ON CLICK FOR RMC...CANCEL PICTURE MOVEMENT OR CE
    	const rightMouseClickProcess = () => {
    		let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId);
    		if(true === isDefaultLRMCWork){
    			console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!');
    			return;
    		}
    		if(rightMouseClickEventId > 0){
    			$gameTemp.reserveCommonEvent(rightMouseClickEventI  d);
    		}
    		//--for cancel picture movement
    		pictureToMoveId = -1;
    		pictureToMoveSpeed = -1;
    		touchedDropzoneId = -1;
    	}
    	
    	//---ON CLICK ON MMC...CIRCLE...FOR CE
    	const middleMouseClickProcess = () => {
    		let isDefaultLRMCWork = $gameSwitches.value(defaultLRMCWorkSwitchId);
    		if(true === isDefaultLRMCWork){
    			console.log('DKR.UsefulPictures_INFO: isDefaultLRMCWork IS ON, CANT WORK!');
    			return;
    		}
    		if(middleMouseClickEventId > 0){
    			$gameTemp.reserveCommonEvent(middleMouseClickEvent  Id);
    		}
    	}
    	
    	
    	//---FOR CLICK: DETECT L-R-M CLICKS
    	TouchInput._onMouseDown = function(event) {
    		if (event.button === 0) {
    			this._onLeftButtonDown(event);
    			leftMouseClickProcess(event);
    		} else if (event.button === 1) {
    			this._onMiddleButtonDown(event);
    			middleMouseClickProcess();
    		} else if (event.button === 2) {
    			this._onRightButtonDown(event);
    			rightMouseClickProcess();
    		}
    	};
    	
    	//---FOR GET PICTURE WIDTH AND HEIGHT
    	const getPictureWidthAndHeight = (pictureId) => {
    		let pictureHeightAndWidth = [-1, -1];
    		
    		try{
    			let picsSpritesetList = SceneManager._scene._spriteset.children.find(obj => obj.children.length >= 99);
    			let pictureSprite = picsSpritesetList.children[pictureId - 1];
    			let pictureWidth =  pictureSprite.width;
    			let pictureHeight =  pictureSprite.height;
    			
    			pictureHeightAndWidth = [pictureWidth, pictureHeight];
    		}catch(exception){
    			console.log('DKR.UsefulPictures_ERROR: getPictureWidthAndHeight: ERROR | pic_id:', pictureId);
    			console.log(exception);
    		}
    		
    		return pictureHeightAndWidth;
    	}
    //----MAKER LOGIC: END		
    	
    	
    	
    //----COMMANDS: BEGIN		
    	//--on/off default left right mouse click
    	DKR.UsefulPictures.disableLRMC = function(){
    		disableMouseStandardBehaviour();
    	}
    	
    	DKR.UsefulPictures.enableLRMC = function(){
    		enableMouseStandardBehaviour();
    	}
    	//--
    	
    	//--set Common events to right muse click and middel mouse click
    	DKR.UsefulPictures.setCommonEventToRMC = function(ceId){
    		rightMouseClickEventId = ceId;
    	}
    	
    	DKR.UsefulPictures.setCommonEventToMMC = function(ceId){
    		middleMouseClickEventId = ceId;
    	}
    	//--
    	
    	//-create/update/delete useful pictures
    	DKR.UsefulPictures.testUsefulPics = function(){
    		let usefulPicsList = $gameVariables.value(usefulPicturesListVarId) || [];
    		console.log('_usefulPicsList:', usefulPicsOnDropzonesVault);
    	}
    	
    	DKR.UsefulPictures.createUsefulPic = function(picSettings){
    		createUsefulPicture(picSettings);
    	}
    	
    	DKR.UsefulPictures.getUsefulPic = function(usefulPicId){
    		return getUsefulPicture(usefulPicId);
    	}
    	
    	
    	DKR.UsefulPictures.updateUsefulPic = function(usefulPicId, listOfSettingsToUpdate){
    		updateUsefulPicture(usefulPicId, listOfSettingsToUpdate);
    	}
    	
    	DKR.UsefulPictures.deleteUsefulPic = function(usefulPicId){
    		deleteUsefulPicture(usefulPicId);
    	}
    	//--
    	
    	//-create/update/delete dropzones
    	DKR.UsefulPictures.testDropzones = function(){
    		let dropzonesList = $gameVariables.value(dropzonesListVarId) || [];
    		console.log('_dropzonesList:', dropzonesList);
    	}
    	
    	DKR.UsefulPictures.createDropZone = function(dropzoneSettings){
    		createDropzone(dropzoneSettings);
    	}
    	
    	DKR.UsefulPictures.getDropZone = function(dropzoneId){
    		return getDropzone(dropzoneId);
    	}
    	
    	DKR.UsefulPictures.updateDropZone = function(dropzoneId, listOfSettingsToUpdate){
    		updateDropzone(dropzoneId, listOfSettingsToUpdate);
    	}
    	
    	DKR.UsefulPictures.deleteDropZone = function(dropzoneId){
    		deleteDropzone(dropzoneId);
    	}
    	//--
    	
    	//--get informtation about useful pictures on dropzones
    	DKR.UsefulPictures.testVault = function(){
    		let usefulPicsOnDropzonesVault = $gameVariables.value(vaultListVarId) || [];
    		console.log(usefulPicsOnDropzonesVault);
    	}
    	
    	DKR.UsefulPictures.isUsefulPicOnDropzones = function(usefulPicId, logicOrIndex){
    		return isUsefulPictureOnDropzones(usefulPicId, logicOrIndex);
    	}
    	
    	DKR.UsefulPictures.isUsefulPicOnConcreteDropzone = function(usefulPicId, dropzoneId){
    		return isUsefulPictureOnConcreteDropzone(usefulPicId, dropzoneId);
    	}
    	
    	DKR.UsefulPictures.getUsefulPicsFromDropzone = function(dropzoneId){
    		return getUsefulPicturesFromDropzone(dropzoneId);
    	}
    	//--
    	
    //----COMMANDS: END		
    
    } )();


    Загрузка:


    Условия поставки плагина:
    Поставляется AS-IS.
    Вся ответственность при использовании - на Пользователе!
    !

    Совместимость:
    Плагин существенно меняет логику работы мыши и частично - картинок.
    Совместимость с другими плагинами на мышь - отсутствует.
    Совместимость с другими плагинами на картинки - не гарантируется.
    С другой стороны - плагин совместим с DKR_EntityCustomData.

    Спойлер Лирическое отступление:
    Наверное, "вершина эволюции" моих экспериментов с картинками, на которые можно тыкать.
    Мы же двигаем картинки по экрану, по сути?
    Теперь можно двигать по факту. =)
    Доберется ли проклятие карточных рогаликов до мейкера? Кто знает...

    Обратите внимание - без просмотра демки работа и настройка плагина может быть не ясна.
    Это издержки подобия универсальности (в моем исполнении). =(


    Благодарности:
    за идею/вдохновение
    nirion , VarVarKa , Green-Leo , Петр .
    специальные благодарности:
    Phileas за идею работы над плагинами, Krimer за методику определения габаритов картинки.
    Последний раз редактировалось Darchan Kaen; 22.01.2022 в 16:46. Причина: Добавлен еще один важный нюанс!

  2. #2
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Перед тем, как задавать вопросы - посмотрите пожалуйста в демку. Там базовый пример эксплуатации.
    Чуть позже, если будет нужно, напишу настройки подробнее.

    P.S:
    С ходу версия 2.0 - так как после публикации видео сделал еще несколько функций (тот же Общий эвент по колёсику) =).
    Последний раз редактировалось Darchan Kaen; 22.01.2022 в 02:35.

  3. #3
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Тему публиковал ночью, засыпая. =)
    Тут расскажу подробнее о концепции, так сказать, плагина - может помочь его использовать.
    Ну и опишу более полно настройки и возможности.

    Спойлер Идея:
    Сама идея плагина, повторюсь, состоит в том, что бы сделать картинки более фунциональными.
    То есть - нажимать на них уже было можно, при помощи дефолтых плагинов MZ - PictureButton и TextButton.
    Вроде бы были плагины и на реакцию при наведении, но на MZ я не нагуглил.
    И я задумался - а нельзя ли перемещать картинки по клику мышши? В принципе, это можно делать и эвентами (и стандартным кодом мейкера), но...
    Перемещение само по себе мало что дает. Полезнее, если на это дело навесить логику...
    И я совместил все в одном - ховер, клик, перемещение с реакциями на это все.

    Под перемещением картинки понимается следующее - (при соответствующей настройке) вы нажимаете на картинку левой кнопкой мыши,
    после чего при нажатии левой кнопкой мыши в другую часть экрана - картинку летит туда.
    Если после нажатия на картинку нажать правой кнопкой - выбор картинки отменяется!
    Если после перемещения картинка оказалась в Дропзоне - что-то происходит (что настроили).
    Если вы перемещаете картинку командами мейкера - не происходит ничего...ТОЛЬКО кликом мыши!


    Спойлер Концепция:
    Думаю, относительно вызова Общего события при нажатии на правую кнопку мыши или колёсика, все ясно (нажал - запустилось событие).
    А вот с движением картинок интереснее. В терминах данного плагина картинки делятся на: "полезные картинки" (в плагине - "uzefulPicture") и "дропзоны"("dropzone").
    Очень важно запомнить, что в данном плагине картинка ИЛИ "Полезная" ИЛИ "Дропзона" - и тем и другим сразу картинка быть не может!!!

    Полезная картинка - картинка, с которой можно проводить дополнительные манипуляции (ховер мыши, клик ЛКМ, перемещение).
    Дропзона - картинка, которая принимает на себя Полезную картинку и вызывает Общее событие при вхождении ее на себя.
    Под "вхождениям на себя" имеется ввиду, что координаты Полезной картинки находятся в пределах координат Дропзоны.
    При этом, мейкер считает координаты всех картинок от верхнего левого края картинки (см. рисунок).

    Теоретически, можно сделать и другой расчет пересечения, но это я уже не осилил. Может быть у вас получится. =)



    Если проводить параллель с реальностью - вы ложите игральную карту (Полезную картинку) на книгу (Дропзону) и происходит ядерный взрыв холодильника, что у вас за спиной.
    Но только если карта - "Дама пик", книга - том сочинений Пушкина и...холодильник закрыт.


    Спойлер Настройка:
    Плагин позволяет, в некоторой степени, настроить поведения Полезных картинок и Дропзон.
    Например, что дропзона реагирует только на полезные картинки с определенной "Меткой", а не на все подряд.
    Или что дропзона отрабатывает только один раз...или что после попадания полезной картинки на дропзону, ее уже нельзя перемещать.

    Вышенаписанное (и то, что будет ниже) - дефолтные возможности.
    С учетом того, что в Общем событии (после клика на картинку, например), можно командами скрипта поменять ее же настройки...Вариантов
    поведения, возможно, гораздо больше.

    Настройка при создании:

    Пример настройки для создания Полезной картинки:
    Код:
    let picSettings = {
    	id: 1,
    	mark: 'JS',
    	isHoverable: true,
    	onHoverCommonEventId: 32,
    	isClickableLeft: true,
    	onLeftClickCommonEventId: 33,
    	isMovable: true,
    	moveSpeed: 60,
    	onDropzoneCommonEventId: 37
    }
    DKR.UsefulPictures.createUsefulPic(picSettings);
    id - номер картинки.
    mark - текст в кавычках; метка, что бы активировать реацию Дропзоны на эту картинку (если у Дропзоны другая метка, то она не реагирует!).
    isHoverable - true / false (да или нет); будет ли вызвано Общее событие при наведении курсора мыши на картинку.
    onHoverCommonEventId - номер Общего события; если isHoverable: true, то вызывает это Общее событие.
    isClickableLeft - true / false (да или нет); будет ли при клике ЛКМ вызвано Общее событие.
    onLeftClickCommonEventId - номер Общего события; если isClickableLeft: true, то вызывает это Общее событие.
    isMovable - true / false (да или нет); будет ли двигаться картинка при кликах ЛКМ.
    moveSpeed - число скорости движения; если isMovable: true, то картинка двигается с указанной скоростью.
    onDropzoneCommonEventId - номер Общего события, вызываемого при помещении данной картинки на подходящую Дропзону.

    То есть, можно сделать картинки:
    а) Только ховер.
    б) Только клик.
    в) Только перемещение.
    г) Комбинация вышеуказанных вариантов.
    д) Плюс вызывать Общее событие, прописанное в этой конкретной картинке (вместе / кроме события на Дропзоне)...или не вызвать.


    Пример настройки для создания Дропзоны картинки:
    Код:
    let dropzoneSettings = {
    	id: 1,
    	mark: 'RPGMAKER',
    	dropState: 'active'
    	dropType: 'free'
    	dropAfter: 'work'
    	onDropCommonEventId: 35
    }
    DKR.UsefulPictures.createDropZone(dropzoneSettings);
    id - номер картинки.
    mark - текст в кавычках; метка, что бы активировать реацию дропзоны на попавшую в нее картинку (если у Полезной картинки другая метка, то дропзона не реагирует!).
    dropState - 'active' или 'sleep'; текущее состояние дропзоны, 'active' - работае или 'sleep' - не работает (ЛУЧШЕ СРАЗУ ПИСАТЬ 'active', т.к. это поле внутренне!)
    dropType - 'free' или 'lock'; действие дропзоны на картинку, после попадания последней в дропзону, 'free' - картинку можно перемещать или 'lock' - картинку больше перемещать нельзя.
    dropAfter - 'work' или 'off'; изменение состояние дропзоны после попадания картинки, 'work' - дропзона остается рабочей или 'off' - дропзона больше не функционирует.

    То есть, можно сделать дропзоны:
    а) Блокирующие картинку после попадания на нее (или не блокирующие).
    б) Выключающиеся после приема первой картинки (или принимающие много картинок).
    в) Вызывающие Общее событие (или не вызывающие).
    г) Также можно сделать дропзону, не активную после создания (и когда нужно, dropState сделать 'active').

    Изменение настроек после создания:

    Все вышеуказанные настройки можно менять вызовом скриптов.
    DKR.UsefulPictures.updateUsefulPic(usefulPicId, listOfSettingsToUpdate) - для Полезных картинок.
    DKR.UsefulPictures.updateDropZone(dropzoneId, listOfSettingsToUpdate) - для Дропзон.

    usefulPicId и dropzoneId - номер картинки, выполняющей роль Полезной картинки или Дропзоны.
    listOfSettingsToUpdate - массив настроек в формате [ ['имя настройки', 'новое значение'], ... , ['имя настройкиN', 'новое значениеN'] ]

    Например для Полезной картинки(из демки):
    Код:
    DKR.UsefulPictures.updateUsefulPic(11, [
    ['isHoverable', true], ['onHoverCommonEventId', 32]
    ]);
    ...тут мы включаем ховер над картинкой №11 и задаем Общее событие, что будет вызываться при ховере.

    Например для Дропзоны(из демки):
    Код:
    DKR.UsefulPictures.updateDropZone(45, [
    ['dropType', 'lock']
    ]);
    ...тут мы меняем тип реакции дропозны (сама дропзона - картинка под номером 45).

    Обратите внимание, т.к. в полезной картинке у нас написано mark: 'JS', а в дропзоне mark: 'RPGMAKER', то перемещение такой картинки в такую дропзону
    не активирует событий ни в картинке, ни в дропзоне! mark (метка) должно совападать.
    Поменять это можно в полезной картинке, или дропзоне, указав для изменения: ['mark', 'JS' (меняем в дропзоне) или 'RPGMAKER' (меняем в картинке)]

    Удаление:

    Удалить полезную картинку или дропзону можно командами:
    DKR.UsefulPictures.deleteUsefulPic(usefulPicId); - для полезной картинки.
    DKR.UsefulPictures.deleteDropZone(dropzoneId); - для дропзоны.
    Удаление картинки командой мейкера НЕ УДАЛИТ ее из настроек плагина!


    Спойлер Дополнительные возможности:
    Кроме настроек, есть еще несколько дополнительных возможностей.

    Переключатель под номером movableSwitchId разрешает / запрещает передвигать картинки...может быть удобно для кат-сцен.
    Для перемещения картинок должен быть включен!

    Переключатель под номером defaultLRMCWorkSwitchId хранить состояние работы мыши и ВРУЧНУЮ ЕГО ПЕРЕКЛЮЧАТЬ НЕ НУЖНО!
    Для включения или отключения работы плагина нужно использовать команды скрипта:
    DKR.UsefulPictures.disableLRMC(); - включает работу плагина, отключая стандартной поведение мыши.
    DKR.UsefulPictures.enableLRMC(); - выключает работу плагина, включая стандартной поведение мыши.

    В переменные под номерами lastHoveredPicVarId, lastClickedPicVarId, lastMovedPicVarId, lastDroppedPicVarId, lastUsedDropzoneVarId записываются номера картинок,
    с которыми последний раз был ховер, лкм, перемещение, помещение на дропзону а также номер дропзоны, куда последний раз поместили картинку.

    В процессе игры можно в любой момент поменять Общее событие, что вызывается по ПКМ или клику на колёсико("МКМ"):
    DKR.UsefulPictures.setCommonEventToRMC(ceId); - для ПКМ.
    DKR.UsefulPictures.setCommonEventToMMC(ceId); - для МКМ.

    Есть команды скриптов, для получение информации о пересечении полезных картинок и дропзон, что может быть полезно для логики игры:

    DKR.UsefulPictures.isUsefulPicOnDropzones(usefulPi cId, logicOrIndex); - позволяет узнать, находится ли картинка с указаным номером хоть на какой-то дропзоне.
    'logicOrIndex' можеть быть 'logic'(тогда возвращает true/false) или 'index' (возвращает номер картинки-дропзоны или -1, если нет результата).

    DKR.UsefulPictures.isUsefulPicOnConcreteDropzone(u sefulPicId, dropzoneId); - если нужно узнать, находится ли опрделенная полезная картинка на конкретной дропзоне (возвращает true/false).

    DKR.UsefulPictures.getUsefulPicsFromDropzone(dropz oneId); - если нужно вернуть перечень всех полезных картинок, что есть на определенной дропзоне (возвращает массив полезных картинок или пустой [], если нет результата).


    Спойлер Заключение:
    Вышло многословно.
    Наверное плагин сложен в настройке и использовании, но я хотел сделать как можно более универсальное и функциональное решение.
    Получилось...что получилось.


    Плагин работает ТОЛЬКО с компьютерной мышью! С геймпадом и тачскрином смартфона плагин не работает.
    Последний раз редактировалось Darchan Kaen; 22.01.2022 в 16:46. Причина: Объяснение с инструкцией

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MZ]DKR_UsefulPictures